#include <stdio.h>
#include <stdlib.h>
#include "estructuras.h"

extern unsigned int* generar_tabla_apariciones(unsigned char *buf, unsigned int size);
extern codigo_t* generar_tabla_codigos(unsigned int *tabla_apariciones);
extern unsigned int calcular_cant_codigos(codigo_t *tabla_codigos);
extern int obtener_tabla_codificacion(codigo_t *tabla_codigos, unsigned int cant_codigos, codificacion_t **ptr_tabla_codificacion, unsigned int *tabla_codificacion_size);

int main(){	
	//Creamos la tabla de apariciones.
	unsigned int size = 100;
	unsigned char *buf = (unsigned char *)malloc(size);
	
	int i;
	for (i = 0; i<size/4; i++){
		buf[i] = 'a';
	}
	
	for (i = size/4; i<size/2; i++){
		buf[i] = 'b';
	}
	
	for (i = size/2; i<size; i++){
		buf[i] = 'c';
	}
	
	unsigned int *tabla_apariciones;
	tabla_apariciones = generar_tabla_apariciones(buf, size);
	
	codigo_t *tabla_codigos = generar_tabla_codigos(tabla_apariciones);
	
	for (i=0; i<256; i++){
		if(tabla_codigos[i].valido){
			printf("Esta es la posicion %i \n", i);
			mostrar_codigo_t(&tabla_codigos[i]);
		}
	}
	
	unsigned int cant_codigos = calcular_cant_codigos(tabla_codigos);
	printf("La cantidad de codigos validos es: %d \n", cant_codigos);
	
	codificacion_t *tabla_codificacion;
	tabla_codificacion = NULL;
	unsigned int tabla_codificacion_size;
	
	int res = obtener_tabla_codificacion(tabla_codigos, cant_codigos, &tabla_codificacion, &tabla_codificacion_size);
	
	printf("El resultado de obtener tabla codificacion %d \n", res);
	
	for (i=0; i<cant_codigos; i++){
		printf("Esta es la posicion %i \n", i);
		mostrar_codificacion_t(&tabla_codificacion[i]);
	}
	
	return 0;
}
